/******************************************************************************
 *      Mestrado em Ciência da Computação - UFMS
 *		Redes de Computadores - Prof. Dr. Ronaldo Alves Ferreira
 *		Alunos: Geraldo Landre, Marcel Tolentino, Vinícius Bueno
 *****************************************************************************/
 
#include "threaded_server.h"

/* #### IMPLEMENTAÇÃO DAS FUNÇÕES DE threaded_server.h #### */

/*
	Inicia um servidor multithread com um pool de threads de tamanho passado por parâmetro
	Parâmetros:
		porta: porta de escuta do servidor
		pool_threads: tamanho do pool de threads
*/
void thread_httpd(vstring *port,int nthreads)
{	
    // flag que avisa as threads que o listen já foi iniciado
    lg_listen_started = 0;

    // variáveis relacionadas ao servidor
    struct addrinfo *srv = NULL;
    int sockfd = 0; // fd do socket do servidor

    // imprime no stdout
    printf("HTTP Server Multi-Thread started on port %s\n",port->pt);
    printf("Number of threads available on pool: %d\n", nthreads);
    printf("Number of requests: %d\n", th_number_of_requests);

    // inicializa o número de requisições tratadas com 0
    th_number_of_requests = 0;

    // socket, com reúso de socket
    sockfd = srv_getboundsockfd(srv,port,1);

    // iniciar o listen
    int status = srv_listen(sockfd,BACKLOG);
    if(status < 0)
    {
        perror("listen:");
        exit(1);
    }

    // flag que avisa as threads que o listen já foi iniciado
    lg_listen_started = 1;

    // inicializa o pool de threads com a quantidade passada por parâmetros
    pool_th pool = pool_init(nthreads);
    // cria as threads que começam a executar a função execute
    pool_start(pool,sockfd);

    while(1);

    sock_close(sockfd,"sockfd");

    // finaliza o uso das pools
    pool_destroy(pool);
}
